package com.caishi.lkx.order;


import com.zzw.common.entity.BSService;
import com.caishi.lkx.order.model.OrderDetailModel;
import com.caishi.lkx.order.model.OrderModel;
import com.caishi.lkx.order.model.UserAssetsDataModel;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * @author by keray
 * date:2019/9/5 14:44
 * 资产类服务
 */
public interface CommonAssetsService<A extends IAssetsModel<A, ID>, ID extends Serializable> extends BSService<A, ID> {

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2021/5/13 5:02 下午</h3>
     * 校验商品是否能够生成订单，
     * 举例数量不足校验失败
     * 商品正好处于不可售卖状态 校验失败
     * </p>
     *
     * @param detailModel
     * @return <p> {@link boolean} </p>
     * @throws
     */
    default boolean createOrderDetailCheck(OrderModel orderModel, OrderDetailModel detailModel) {
        return true;
    }

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/9/5 14:56</h3>
     * 根据开始时间计算资产的有效时间，返回资产到期时间
     * </p>
     *
     * @param sourceId  资产id
     * @param startTime 资产开始时间
     * @return <p> {@link LocalDateTime}
     * 资产永久有效时返回null
     * </p>
     * @throws
     */
    default LocalDateTime computeEndTime(OrderModel orderModel, String sourceId, LocalDateTime startTime) {
        return null;
    }

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/9/9 10:05</h3>
     * 资产实体计算价格
     * </p>
     *
     * @param detailModel
     * @param orderModel
     * @return <p> {@link BigDecimal} </p>
     */
    default long computePrice(OrderModel orderModel, OrderDetailModel detailModel) {
        return 0L;
    }

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/10/9 12:17</h3>
     * 资产发放前处理。举例：商品发放前锁定数量，
     * </p>
     *
     * @param userAssetsDataModel
     * @return <p> {@link Boolean} </p>
     * @throws
     */
    default UserAssetsDataModel assetsIssuePreHandler(OrderModel orderModel, UserAssetsDataModel userAssetsDataModel) {
        return userAssetsDataModel;
    }

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/10/9 12:18</h3>
     * 资产发放后处理 举例：发放成功通知 要保证事务本次写库成功了在发通知
     * </p>
     *
     * @param userAssetsDataModel
     * @return <p> {@link } </p>
     * @throws
     */
    default void assetsIssuePostHandler(OrderModel orderModel, UserAssetsDataModel userAssetsDataModel) {

    }


    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/9/10 16:48</h3>
     * 用户资产过期前处理
     * </p>
     *
     * @param lastOrder           最后操作资产的订单
     * @param userAssetsDataModel 用户资产数据
     * @return <p> {@link } </p>
     * @throws
     */
    default boolean overduePreHandler(OrderModel lastOrder, UserAssetsDataModel userAssetsDataModel) {
        return true;
    }

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/9/10 16:48</h3>
     * 用户资产过期后处理
     * </p>
     *
     * @param lastOrder           最后操作资产的订单
     * @param userAssetsDataModel 用户资产数据
     * @return <p> {@link A} </p>
     * @throws
     */
    default void overduePostHandler(OrderModel lastOrder, UserAssetsDataModel userAssetsDataModel) {

    }


    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/12/5 11:11 AM</h3>
     * 资产是否允许退回 举例：课程被看完了 不允许退款
     * </p>
     *
     * @param assets
     * @param userAssetsDataModel
     * @return <p> {@link boolean} </p>
     */
    default boolean assetsAllowRefund(OrderModel orderModel, OrderDetailModel detailModel, UserAssetsDataModel userAssetsDataModel) {
        return true;
    }

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/12/5 11:10 AM</h3>
     * 资产退回回调
     * </p>
     *
     * @param userAssetsDataModel 用户资产数据 举例：课程退款后删除用户的课程记录
     * @return <p> {@link UserAssetsDataModel} </p>
     * @throws
     */
    default void assetsRefundCall(OrderModel orderModel, UserAssetsDataModel userAssetsDataModel) {

    }

    default IAssetsModel<A, ID> assetsDetail(String id) {
        return getById((ID) id);
    }

    String orderOnlinePayTitle(OrderModel orderModel, String id);

}
